package com.gljx.util;

import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * 工具类
* @author LiXiang
* @date 2017年10月12日 下午3:36:58 
*
 */
public class CommonUtil {
	/**
	 * 当前系统时间
	 * @return
	 */
	public static String nowTime(){
		Date date=new Date();  
	    SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
	    String time=formatter.format(date);  
		return time;
	}
	/**
	 * 当前时间 减xx天
	* @param day
	* @return
	* @author LiXiang  @date 2017年11月3日 下午2:53:32
	 */
	public static String subTime(Integer day){
		Date date = new Date();//获取当前时间    
		Calendar calendar = Calendar.getInstance();    
		calendar.setTime(date);    
		calendar.add(Calendar.DAY_OF_MONTH, -day);
		date=calendar.getTime();
	    SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
	    return formatter.format(date); 
	}

	public static String setTimeByDay(String ymd,String time,Integer days) throws ParseException {
		DateFormat df = new SimpleDateFormat(ymd);

		Date dd = null;
		Calendar calendar = Calendar.getInstance();

		dd = df.parse(time);
		calendar.setTime(dd);
		calendar.add(Calendar.DAY_OF_MONTH, days);//加 XX 天

		return df.format(calendar.getTime());
	}

	/**
	 * 判断字符是否为时间
	 * @Author:  LiXiang 
	 * @Date: Created in 2018/2/8 15:50
	 * @param date
	 * @param ymd
	 * @return
	 */
	public static boolean flagStringIsDate(String ymd,String date){
		SimpleDateFormat dateFormat = new SimpleDateFormat(ymd);
		try
		{
			if(StringUtils.isEmpty(date)){
				return false;
			}
			dateFormat.parse(date);

			return true;
		}
		catch (Exception e)
		{
			// 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
			return false;
		}
	}

	/**
	 * 当前系统时间 年月日
	 * @return
	 */
	public static String nowTimeYMD(){
		Date date=new Date();  
	    SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd");  
	    String time=formatter.format(date);  
		return time;
	}
	/**
	 * 指定格式的当前时间
	* @param ymd
	* @return
	* @author LiXiang  @date 2017年11月29日 下午3:36:18
	 */
	public static String nowTimeSp(String ymd){
		Date date=new Date();  
	    SimpleDateFormat formatter=new SimpleDateFormat(ymd);  
	    String time=formatter.format(date);  
		return time;
	}
	/**
	 * yyyy-MM-dd HH:mm:ss 转化为指定格式
	* @param ymd
	* @param date
	* @return
	* @throws ParseException
	* @author LiXiang  @date 2017年11月29日 下午3:45:12
	 */
	public static String setDateToDate(String ymd,String date) throws ParseException{
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date2 = sdf.parse(date);
	    SimpleDateFormat formatter=new SimpleDateFormat(ymd);  
	    String time=formatter.format(date2);  
		return time;
	}

	public static String dateToDate(Date date){
		if(date == null){
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		String time=sdf.format(date);
		return time;
	}

	/**
	 * 是否含有特殊字符  有非法字符返回true  
	 * 严格校验
	* @return
	* @author LiXiang  @date 2017年9月21日 上午10:24:34
	 */
	public static boolean isSpecialChar_strict(String... strs) {
		//正则
        String regEx = "[ _`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]|\n|\r|\t";
        Pattern p = Pattern.compile(regEx);
        
        boolean result = false;
        for(String str : strs){
        	if(str == null){
        		continue;
        	}
        	Matcher m = p.matcher(str);
        	result = m.find();
        	//如果有非法字符返回true
        	if(result){
        		return result;
        	}
        }
        
        return result;
     }
	/**
	 * 有非法字符返回true 
	 * 简易校验
	* @param strs
	* @return
	* @author LiXiang  @date 2017年11月23日 下午2:00:06
	 */
	 public static boolean isSpecialChar_simple(String... strs) {
		 
        String regEx = "[ `~!@#$%^&*()+=|{}':;'\\[\\]<>/?~@]|\n|\r|\t";
        Pattern p = Pattern.compile(regEx);
        
        boolean result = false;
        for(String str : strs){
        	if(str == null){
        		continue;
        	}
        	Matcher m = p.matcher(str);
        	result = m.find();
        	//如果有非法字符返回true
        	if(result){
        		return result;
        	}
        }
        
        return result;
     }

	/**
	 * 去除指定字符的审核
	 * @Author:  LiXiang 
	 * @Date: Created in 2018/2/28 10:23
	 * @param list
	 * @param strs
	 * @return
	 */
	public static boolean isSpecialChar_simple_deletStr(String [] list,String... strs){
		String regEx = "[ `~!@#$%^&*()+=|{}':;'\\[\\]<>/?~@]|\n|\r|\t";
		for(int i = 0; i < list.length; i++) {
			regEx=regEx.replace(list[i],"");
		}

		Pattern p = Pattern.compile(regEx);

		boolean result = false;
		for(String str : strs){
			if(str == null){
				continue;
			}
			Matcher m = p.matcher(str);
			result = m.find();
			//如果有非法字符返回true
			if(result){
				return result;
			}
		}

		return result;
	 }
	 /**
	  * 时间校验
	 * @return
	 * @author LiXiang  @date 2017年11月23日 下午1:59:47
	  */
	 public static boolean isErrorDate(String setStr,String... strs) {
		 boolean convertSuccess=false;
		 for(String str : strs){
				if(str == null || "".equals(str)){
					 continue;
				}
				if(str.length()!=setStr.length()){
					 return true;
				}
				if(convertSuccess){
					return convertSuccess;
				}
	        	//指定日期格式为四位年/两位月份/两位日期，注意yyyy/MM/dd区分大小写；
	            SimpleDateFormat format = new SimpleDateFormat(setStr);
	            try {
		           	 // 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期，比如2007/02/29会被接受，并转换成2007/03/01
		           	 format.setLenient(false);
	                 format.parse(str);
	            } catch (ParseException e) {
	           	 	 // 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
	           	 	 convertSuccess=true;
	           }
	        }
		 
        return convertSuccess;
	 }
	 /**
	  * 特定字符转换方法
	 * @param str  传入
	 * @param strs 甄别字符
	 * @return
	 * @author LiXiang  @date 2017年10月27日 上午9:25:48
	  */
	 public static String isConstant(String str,String...strs){
		 
		 if(str == null){
			 return "no";
		 }else{
			 boolean flag = true;
			 //如果 传入字符与校验字符相符跳出循环并将判别属性改为false不强制更改
			 for(String strI : strs){
				 if(strI.equals(str)){
					 flag = false;
					 break;
				 }
			 }
			 if(flag){
				 return "no";
			 }
			 return str;
		 }
	 }
	 /**
	  * 获取利用反射获取类里面的值和名称 将object转为map
	 * @param obj
	 * @param prefix
	 * @return
	 * @throws IllegalAccessException
	 * @author LiXiang  @date 2017年10月26日 上午9:08:03
	  */
	 public static Map<String, Object> objectToMap(Object obj,String  prefix,List<String> excludeFields) throws IllegalAccessException {
		 boolean isExclude=false; 
		 if (excludeFields!=null){
             isExclude=true;
         }
		 Map<String, Object> map = new HashMap<>();
          Class<?> clazz = obj.getClass();
          for (Field field : clazz.getDeclaredFields()) {
        	  String fieldName = field.getName();
        	  
        	  if (isExclude&&excludeFields.contains(fieldName)){
                  continue;
              }
              field.setAccessible(true);
              Object value = field.get(obj);
              //格式化时间参数
			  if(value instanceof Date){
				  SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				  String time=formatter.format(value);
				  map.put(prefix+fieldName, time);
			  }else{
				  map.put(prefix+fieldName, value);
			  }
          }
          return map;
      }
	 /**
	  * map转object
	 * @param map
	 * @param beanClass
	 * @param prefix
	 * @return
	 * @throws Exception
	 * @author LiXiang  @date 2017年10月26日 上午10:03:47
	  */
	 public static Object mapToObject(Map<String, Object> map, Class<?> beanClass,String prefix) throws Exception {      
	        if (map == null)    
	            return null;      
	     
	        Object obj = beanClass.newInstance();    
	     
	        Field[] fields = obj.getClass().getDeclaredFields();     
	        for (Field field : fields) {      
	            int mod = field.getModifiers();      
	            if(Modifier.isStatic(mod) || Modifier.isFinal(mod)){      
	                continue;      
	            }      
	     
	            field.setAccessible(true);      
	            field.set(obj, map.get(prefix+field.getName()));     
	        }     
	     
	        return obj;      
	    }   
	 /**
	     * 驼峰法转下划线
	     * @param line 源字符串
	     * @return 转换后的字符串
	     */
	 public static String easyUI_sortToSql(String line){
	        if(line==null||"".equals(line)){
	            return "";
	        }
	        line=String.valueOf(line.charAt(0)).toUpperCase().concat(line.substring(1));
	        StringBuffer sb=new StringBuffer();
	        Pattern pattern=Pattern.compile("[A-Z]([a-z\\d]+)?");
	        Matcher matcher=pattern.matcher(line);
	        while(matcher.find()){
	            String word=matcher.group();
	            sb.append(word.toUpperCase());
	            sb.append(matcher.end()==line.length()?"":"_");
	        }
	        return sb.toString();
	 }
}
